Z-Clipping

MasterBoy

The main purpose of z-clipping is to prevent a triangle from trashing memory and drawing out of the screenspace.

Okay, now let's get busy.

First I'll explain what the intersection is: The intersection is the point where the line crosses the plane:

     A
      \
        \  C
   -------\--------   it's the z-plane
            \
             B

Now the intersected point is C. So you draw a new line AC instead of AB.

How do we calculate the intersected point? Well, easy: There is a parametric line formula:

       intersected_x = x1 + t * ( x2 - x1 );
       intersected_y = y1 + t * ( y2 - y1 );
       intersected_z = z1 + t * ( z2 - z1 );

You probably ask yourself: "How the fuck do I calculate the t or maybe not?" The answer is simple:

       z_min = z1 + t * ( z2 - z1 );
       z_min - z1 = t * ( z2 - z1 );
       t = (z_near - z1 ) / ( z2 - z1 );
       z_near and z_min are eqaul

Think of your triangle as three lines. Just make a procedure for finding the intersected points.

  point3d TMP;

  int z_min=15; // try different values

  void clip( point3d *src , point3d *dst )
  {
   float t = (float)( z_min - dst->z ) / (float) ( src->z - dst->z );

    TMP.x = dst->x + t * ( src->x - dst->x ) ;
    TMP.y = dst->y + t * ( src->y - dst->y ) ;
    TMP.z = dst->z + t * ( src->z - dst->z ) ;
    TMP.u = dst->y + t * ( src->u - dst->y ) ;
    TMP.v = dst->v + t * ( src->v - dst->v ) ;
  }

How we do it is simple. But first watch this:

             Y
            /|\
             |
             |3
             |2
             |1
    ---------|--------->X
             |-1
             |-2
             |-3
             |-4

So you see: All the axes here are reversed. Unlike in computer, the bigger the Y-axis is, the more below it is.

Just sort your triangle lines by their Z-values as:

A - Top
B - Middle
C - Bottom

If you don't know how to sort, then contact me. ;)

Okay, now let's get to the main part. First we should check if all the triangle is behind the z_min:

So

if ( A.z < z_min ) and ( B.z < z_min ) and ( C.z < z_min ) continue;

because all the triangle is behind the plane and it's invisible.

   if ( A.z < z_min ) continue ; // its invisible

   if ( C.z > z_min )
   {
     put your triangle on the screen, it's fully visible

      triangle(A,B,C);

      continue;
   }

   if ( B.z < Z_min) {

    // it needs to be clipped
    // you need to find the intersected points now

    clip (B,A);

    E=TMP;

    clip (C,A);

    F=TMP;

    draw_triangle(A,E,F);

    continue;

  }

If it still hasn't continued, we will get a quad:

Just find the intersected points and draw two triangles.

For comments, insults, threats, email bombs or if you need help, contact me.

Greetings go to: kalms, kombat, sosay, velocity, mrz_ai, phred, nick-s, borzom, civax, smallbrain, yoyo, trashey, cycat, adok, cube, radium, lord^crc, gfunk, coaxcable, adept, trip, satanic jungle, gyr, octan, bananmos, biomass, idiotboy, gash, macaw, matja, parody, tanis, timluther, TNSe^98, xls, zippy, sarix, sagacity, gash, asm[exe], the lotus. I hope that I didn't forget somebody.

- MasterBoy
ICQ: 14054887